package Ep01_Array.Mar04th_0059;

/**
 * @author Jimmy
 * @date 2023/3/4 - 13:49
 */
public class Mine {

    public static void main(String[] args) {
        Mine e = new Mine();
        int n = 3;
        int[][] res = e.generateMatrix_Mine(n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(res[i][j] + "\t");
            }
            System.out.println();
        }
    }

    public int[][] generateMatrix_Mine(int n){

        int loop = 0;   // 控制循环圈数
        int[][] result = new int[n][n];
        int start = 0;
        int count = 1;
        int i, j;

        while (loop < n/2){

            // 上侧从左到右，j从start开始向后遍历，遍历到j=n-loop时，是该for的最后一次填数，之后j++到等于n-loop跳出
            // 此时的j==n-loop，因此是在未填圈的最外一层
            // 如：n=3，loop=0，j只填写了j=0和j=1时的数字，j=2时跳出，但是j已经++了，所以j最终等于2，留给下一步右侧要填的列
            for (j = start; j < n - loop - 1; j++) {
                result[start][j] = count++;
            }

            // 右侧从上到下
            for (i = start; i < n - loop - 1; i++){
                result[i][j] = count++;
            }

            // 下侧从右到左
            for (; j >= loop + 1; j--){
                result[i][j] = count++;
            }

            // 左侧从下到上
            for (; i >= loop + 1; i--){
                result[i][j] = count++;
            }
            start++;    // 控制起始位置，也就是控制填写第几圈
            loop ++;
        }
        if (n % 2 == 1){
            result[n/2][n/2] = n*n;
        }
        return result;
    }
}
